package com.lovi.homework;

/**
 * 反转字符串内特定的部分
 * abcdef --> aedcbf
 * 思路分析：
 * 反转索引为1-4的字符串
 * for循环进行遍历char，两个指针，一个是读取char的指针i
 * 一个是交换的指针j
 * 本案例：
 * i = 1,j = 4,
 * i=2,j=3 【允许】i < j
 * i=3,j=2【这是不允许的】也就是不允许 i > j
 * 我需要判断i == j的 情况
 * 如果要反转的是1-5呢？也就是单数的情况
 * i=1,j=5
 * i=2,j=4
 * i=3,j=3【这个也可以停下来不用交换了】
 * 因此对于 i==j 也不需要交换，所以只需要i < j 进行交换即可
 */
public class Homework01 {
    public static void main(String[] args) {
        //测试
        String str = "abcdef";
        System.out.println("===交换前===");
        System.out.println(str);
        try {
            str = reverse(str, 1, 4);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return;
        }
        System.out.println("===交换后===");
        System.out.println(str);
    }

    /**
     * (1) 将字符串中指定部分进行反转。比如将"abcdef"反转为"aedcbf"
     * (2) 编写方法 public static String reverse(String  str, int start , int end) 搞定
     * 思路分析
     * (1) 先把方法定义确定
     * (2) 把 String 转成 char[] ，因为char[] 的元素是可以交换的
     * (3) 画出分析示意图
     * (4) 代码实现
     */
    public static String reverse(String str, int start, int end) {


        //对输入的参数做一个验证
        //老韩重要的编程技巧分享!!!
        //(1) 写出正确的情况
        //(2) 然后取反即可
        //(3) 这样写，你的思路就不乱
        if(!(str != null && start >= 0 && end > start && end < str.length())) {
            throw new RuntimeException("参数不正确");
        }

        char[] chars = str.toCharArray();
        char temp = ' '; //交换辅助变量
        for (int i = start, j = end; i < j; i++, j--) {
            temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        //使用chars 重新构建一个String 返回即可
        return new String(chars);

    }
}
